<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <link href='/css/styles.css' rel='stylesheet' type='text/css' />
    <link href='/images/favicon.png' rel='shortcut icon' />
    <script src='/js/jquery.min.1.4.js'></script>
    <script src='/js/app.js'></script>
    <script src='/js/common.js'></script>
    
    <meta content='width=device-width, minimum-scale=1.0, maximum-scale=1.0' name='viewport' />
    <title>redis - 命令</title>
	<meta http-equiv="description" content="redis中文资料站，下载安装redis，查找redis常用命令（commands），选择适合的redis客户端方式，配置redis主从（master-slave），阅读redis官方文档，社区里了解更多redis信息，提交redis的bug。" />
	
  </head>
  <body class=''>
    <script src='/js/head.js'></script>
    <div class='text'>
      <h1 class='command'>
        <span id='command_name_span' class='name'></span>
        <span id='command_args_span' class='arg'></span>
      </h1>
      <article>
      	<aside>
        	<script type='text/javascript'>showCmdURL();</script>
        </aside>
        
        <div class='metadata'>
          <p><strong>加入版本 <span id='command_ver_span'></span>。</strong></p>
          <p><strong>时间复杂度：</strong> O(1)。</p>
        </div>
        
        <p>原子性地返回并移除存储在 <code>source</code> 的列表的最后一个元素（列表尾部元素），
        并把该元素放入存储在 <code>destination</code> 的列表的第一个元素位置（列表头部）。</p>
        
        <p>例如：假设 <code>source</code> 存储着列表 <code>a,b,c</code>， <code>destination</code>存储着列表 <code>x,y,z</code>。
        执行 <a href="/commands/rpoplpush.html">RPOPLPUSH</a> 得到的结果是 <code>source</code> 保存着列表 <code>a,b</code> ，而
         <code>destination</code> 保存着列表 <code>c,x,y,z</code>。</p>
        
        <p>如果 <code>source</code> 不存在，那么会返回 <code>nil</code> 值，并且不会执行任何操作。
        如果 <code>source</code> 和 <code>destination</code> 是同样的，那么这个操作等同于移除列表最后一个元素并且把该元素放在列表头部，
        所以这个命令也可以当作是一个旋转列表的命令。</p>
        
        <h2>返回值</h2>
        
        <p><a href="/topics/protocol.html#bulk-reply">批量回复</a>: 被移除和放入的元素</p>
        
        <h2>例子</h2>
        
        <div class='example' data-session='e5571c96bffba603e58538bfc6b20ad7'>
          <span class='monospace prompt'>redis&gt;&nbsp;</span>
          <span class='monospace command'>RPUSH mylist &quot;one&quot;</span>
          <pre>(integer) 1</pre>
          <span class='monospace prompt'>redis&gt;&nbsp;</span>
          <span class='monospace command'>RPUSH mylist &quot;two&quot;</span>
          <pre>(integer) 2</pre>
          <span class='monospace prompt'>redis&gt;&nbsp;</span>
          <span class='monospace command'>RPUSH mylist &quot;three&quot;</span>
          <pre>(integer) 3</pre>
          <span class='monospace prompt'>redis&gt;&nbsp;</span>
          <span class='monospace command'>RPOPLPUSH mylist myotherlist</span>
          <pre>"three"</pre>
          <span class='monospace prompt'>redis&gt;&nbsp;</span>
          <span class='monospace command'>LRANGE mylist 0 -1</span>
          <pre>1) "one"&#x000A;2) "two"</pre>
          <span class='monospace prompt'>redis&gt;&nbsp;</span>
          <span class='monospace command'>LRANGE myotherlist 0 -1</span>
          <pre>1) "three"</pre><form>
            <span class='monospace prompt'>redis&gt;&nbsp;</span>
            <input autocomplete='off' name='command' spellcheck='false' type='text' />
          </form></div>
        
        
        <h2>模式：安全的队列</h2>
        
        <p>Redis通常都被用做一个处理各种后台工作或消息任务的消息服务器。
        一个简单的队列模式就是：生产者把消息放入一个列表中，等待消息的消费者用 <a href="/commands/rpop.html">RPOP</a> 命令（用轮询方式），
        或者用 <a href="/commands/brpop.html">BRPOP</a> 命令（如果客户端使用阻塞操作会更好）来得到这个消息。</p>
        
        <p>然而，因为消息有可能会丢失，所以这种队列并是<em>不安全</em>的。例如，当接收到消息后，出现了网络问题或者消费者端崩溃了，
        那么这个消息就丢失了。</p>
        
        <p><a href="/commands/rpoplpush.html">RPOPLPUSH</a> (或者其阻塞版本的 <a href="/commands/brpoplpush.html">BRPOPLPUSH</a>）
        提供了一种方法来避免这个问题：消费者端取到消息的同时把该消息放入一个<em>正在处理中</em>的列表。
        当消息被处理了之后，该命令会使用 <a href="/commands/lrem.html">LREM</a> 命令来移除<em>正在处理中</em>列表中的对应消息。</p>
        
        <p>另外，可以添加一个客户端来监控这个<em>正在处理中</em>列表，如果有某些消息已经在这个列表中存在很长时间了（即超过一定的处理时限），
        那么这个客户端会把这些超时消息重新加入到队列中。</p>
        
        <h2>模式：循环列表</h2>

        <p><a href="/commands/rpoplpush.html">RPOPLPUSH</a> 命令的 <code>source</code> 和  <code>destination</code> 是相同的话，
        那么客户端在访问一个拥有n个元素的列表时，可以在 <span class="math">O(N)</span> 时间里一个接一个获取列表元素，
        而不用像 <a href="/commands/lrange.html">LRANGE</a> 那样需要把整个列表从服务器端传送到客户端。</p>
        
        <p>上面这种模式即使在以下两种情况下照样能很好地工作：
        * 有多个客户端同时对同一个列表进行旋转（rotating）：它们会取得不同的元素，直到列表里所有元素都被访问过，又从头开始这个操作。
        * 有其他客户端在往列表末端加入新的元素。</p>
        
        <p>这个模式让我们可以很容易地实现这样一个系统：有 N 个客户端，需要连续不断地对一批元素进行处理，而且处理的过程必须尽可能地快。
        一个典型的例子就是服务器上的监控程序：它们需要在尽可能短的时间内，并行地检查一批网站，确保它们的可访问性。</p>
        
        <p>值得注意的是，使用这个模式的客户端是易于扩展（scalable）且安全的（reliable），因为即使客户端把接收到的消息丢失了，
        这个消息依然存在于队列中，等下次迭代到它的时候，由其他客户端进行处理。</p>
        
      </article>
    </div>
    <script type='text/javascript'>startShow();</script>
    <div class='text' id='comments'>
      <div id='disqus_thread'></div>
      <script type='text/javascript'>
        //<![CDATA[
          var disqus_shortname = 'rediscn';
          
          // The following are highly recommended additional parameters. Remove the slashes in front to use.
          var disqus_identifier = 'command_'+curCommandObj.key;
          var disqus_url = curCommandObj.getdisqusUrl();
          
          /* * * DON'T EDIT BELOW THIS LINE * * */
          (function() {
            var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
              dsq.src = 'http://' + disqus_shortname + '.disqus.com/embed.js';
              (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
          })();
        //]]>
      </script>
      <a class='dsq-brlink' href='http://disqus.com'>
        Comments powered by
        <span class='logo-disqus'>
          Disqus
        </span>
      </a>
    </div>

    
    <script src='/js/foot.js'></script>
    
  </body>
</html>
